package com.salt.core.oss;

import com.salt.core.oss.model.OssFile;
import com.salt.core.oss.model.SaltFile;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.util.List;

/**
 * @Description OssTemplate抽象API
 * @Author salt
 * @Date 2020-11-09
 * @Version 1.0.1
 */
public interface OssTemplate {

    /**
     * 创建存储桶
     * @param bucketName 存储桶名称
     */
    void makeBucket(String bucketName);

    /**
     * 删除存储桶
     * @param bucketName 存储桶名称
     */
    void removeBucket(String bucketName);

    /**
     * 存储桶是否存在
     * @param bucketName 存储桶名称
     * @return
     */
    boolean bucketExists(String bucketName);

    /**
     * 拷贝文件
     * @param bucketName 存储桶名称
     * @param fileName 存储桶文件名称
     * @param destBucketName  目标存储桶名称
     */
    void copyFile(String bucketName, String fileName, String destBucketName);

    /**
     * 拷贝文件
     * @param bucketName 存储桶名称
     * @param fileName 存储桶文件名称
     * @param destBucketName 目标存储桶名称
     * @param destFileName 目标存储桶文件名称
     */
    void copyFile(String bucketName, String fileName, String destBucketName, String destFileName);

    /**
     * 获取文件信息
     * @param fileName 存储桶文件名称
     * @return
     */
    OssFile statFile(String fileName);

    /**
     * 获取文件信息
     * @param bucketName 存储桶名称
     * @param fileName 存储桶文件名称
     * @return
     */
    OssFile statFile(String bucketName, String fileName);

    /**
     * 获取文件相对路径
     * @param fileName 存储桶文件名称
     * @return
     */
    String filePath(String fileName);

    /**
     * 获取文件相对路径
     * @param bucketName 存储桶名称
     * @param fileName 存储桶文件名称
     * @return
     */
    String filePath(String bucketName, String fileName);

    /**
     * 获取文件地址
     * @param fileName 存储桶文件名称
     * @return
     */
    String fileLink(String fileName);

    /**
     * 获取文件地址
     * @param bucketName 存储桶名称
     * @param fileName 存储桶文件名称
     * @return
     */
    String fileLink(String bucketName, String fileName);

    /**
     * 获取文件地址 外网
     * @param fileName 存储桶文件名称
     * @return
     */
    String outerFileLink(String fileName);

    /**
     * 获取文件地址 外网
     * @param bucketName 存储桶名称
     * @param fileName 存储桶文件名称
     * @return
     */
    String outerFileLink(String bucketName, String fileName);

    /**
     * 上传文件
     * @param file 上传文件类
     * @return
     */
    SaltFile putFile(MultipartFile file);

    /**
     * 上传文件
     * @param file 上产文件类
     * @param fileName 上传文件类名
     * @return
     */
    SaltFile putFile(MultipartFile file, String fileName);

    /**
     * 上传文件
     * @param file 上传文件类
     * @param fileName 上传文件类名
     * @param bucketName 存储桶名称
     * @return
     */
    SaltFile putFile(MultipartFile file, String fileName, String bucketName);

    /**
     * 上传文件
     * @param fileName 存储桶文件名称
     * @param stream 文件流
     * @return
     */
    SaltFile putFile(String fileName, InputStream stream);

    /**
     * 上传文件
     * @param bucketName 存储桶名称
     * @param fileName 存储桶文件名称
     * @param stream 文件流
     * @return
     */
    SaltFile putFile(String bucketName, String fileName, InputStream stream);

    /**
     * 删除文件
     * @param fileName 存储桶文件名称
     */
    void removeFile(String fileName);

    /**
     * 删除文件
     * @param bucketName 存储桶名称
     * @param fileName 存储桶文件名称
     */
    void removeFile(String bucketName, String fileName);

    /**
     * 批量删除文件
     * @param fileNames 存储桶文件名称集合
     */
    void removeFiles(List<String> fileNames);

    /**
     * 批量删除文件
     * @param bucketName 存储桶名称
     * @param fileNames 存储桶文件名称集合
     */
    void removeFiles(String bucketName, List<String> fileNames);

    /**
     * 下载文件
     * @param request 请求
     * @param response 响应
     * @param originalFilename 原始文件名
     * @param fileName 存储桶文件名称
     */
    void downloadFile(HttpServletRequest request, HttpServletResponse response, String originalFilename, String fileName);

    /**
     * 图片流的base64编码
     * @param objectName
     * @param formatName
     * @return 图片流的base64编码
     */
    String getImageBase64(String objectName, String formatName);

    /**
     * 图片流的base64编码
     * @param objectName
     * @return 图片流的base64编码
     */
    String getImageBase64(String objectName);

    /**
     * 图片流的base64编码
     * @param objectName
     * @param formatName
     * @return 图片流的base64编码
     */
    String getImageBase64(String bucketName,String objectName, String formatName);
}
